package com.suliu.practice.thread;

public class ThreadTest {
	public static void main(String[] args) {
		Example e=new Example();
		Thread t1=new TheThread1(e);
		//e=new Example();//另外一个对象
		Thread t2=new TheThread2(e);
		t1.start();
		t2.start();
	}
}
//synchronize执行完或者异常才会释放。synchronized有个问题是一旦锁上就没法中途叫他不要锁了。1.4以后增加了concurrent并发包，可以解决这种问题。
class Example{
	private Object o=new Object();//被synchronize保护的数据应该是private的
	public void excute1(){//synchronized放在普通方法前，给对象上锁，其他线程无法访问该对象的任何synchronized方法
		synchronized(o){//把o锁上。如果是this就和synchronized锁定方法一样。推荐使用synchronized块，更细粒度不用锁定整个对象。
			for (int i = 0; i < 20; i++) {
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("excute1:"+i);
			}
		}
	}
	public void excute2(){//加了static，锁的是当前对象对应的那个class对象
		synchronized(o){//把o锁上
			for (int i = 0; i < 20; i++) {
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("excute2:"+i);
			}
		}
	}
}
class TheThread1 extends Thread{
	private Example e;
	public TheThread1(Example e){
		this.e=e;
	}
	@Override
	public void run() {
		this.e.excute1();
	}
}
class TheThread2 extends Thread{
	private Example e;
	public TheThread2(Example e){
		this.e=e;
	}
	@Override
	public void run() {
		this.e.excute2();
	}
}